package metier.sess;

import java.util.Calendar;
import java.util.Date;
import java.util.List;

import javax.ejb.EJB;
import javax.ejb.Schedule;
import javax.ejb.Stateless;

import metier.entities.Declaration;
import metier.entities.Employe;
import metier.entities.Message;
import metier.entities.Offre;


@Stateless
public class TachesPrograme {
	
	
	@EJB
	private IMessageLocal metierMessage;
	
	@EJB
	private IOffreLocal metier;
	
	@EJB 
	private IUtilisateurLocal metierClient;
	
	@EJB
	private IDeclarationLocal metierDec;
	
	private Integer minutes=5;
	
	
	 @Schedule(second = "59", minute = "*", hour = "*")
	    public void doScheduleTaskFirst() {
	       archive();
	       System.out.println("archiver");
	       DeclarationGagner();
	       System.out.println("Déclarations gagnantes");
	    }
	

	 //fonction qui permet d'archiver les offres
	 //fonction qui permet de détécter les déclarations ganante pour chaque offre
		//programme qui archive les offres
		public void archive()
		{
			List<Offre> listeOffre=metier.listeOffre(1,null,0) ;
			System.out.println("archive"+listeOffre.size());
			for(int i=0;i<listeOffre.size();i++)
			{
				
				if((listeOffre.get(i).getDecGanante()==null) && (listeOffre.get(i).getDate_Expiration().compareTo(new Date()) < 0) )
				{
					
					System.out.println("lool");
					Offre o=listeOffre.get(i);
					o.setStatutOffre(6);
					metier.updateOffre(o);
					Message m=new Message("Offre archived", ((Employe)metierClient.getUtilisateur(34)), o.getExpediteur(), "your shipment "+o.getIdOffre()+" is archived",new Date());
					metierMessage.addMessage(m);
					
				}
				
			}
		
		}

		//envoyer un message au transporteur lorsqu'une déclaration a gagné
		public void DeclarationGagner()
		{
			
			List<Offre> listeOffre=metier.listeOffre(1,null,0) ;
			for(int i=0;i<listeOffre.size();i++)
			{
			//////////////
				 List<Declaration> ld=metierDec.getDeclarationGagnante(listeOffre.get(i));
				  //teser la dernière déclaration pour savoir si l'offre doit etre archivé ou pas
				  if(ld.size()!=0)
				  {
					  
					  if(ld.get(0).getPrice() <= listeOffre.get(i).getPrix_desire())
					  {
					 
					  Date DQMP=ld.get(0).getDateCreation();
					  
					  Date date = new Date();
					  
					  Calendar cal = Calendar.getInstance();
					  Calendar cal1 = Calendar.getInstance();
					    
					  cal1.setTime(date);
					  cal.setTime(DQMP);
					    
					  cal.add(Calendar.MINUTE, minutes);
					  
					    //régler le probleme de l'heur
					//  cal1.add(Calendar.HOUR, 1);
					  if(cal.getTime().compareTo(cal1.getTime())<=0)
					  {
						  
					
						//ajouter la declaration gagnante
						
						//envoyer à un transporteur
						Message mt=new Message("bid winner", ((Employe)metierClient.getUtilisateur(34)), ld.get(0).getTransporteur(),"the bid"+ld.get(0)+"is the winner accept the bid ",new Date()); 
						//anvoyer à l'expéditeur
						Message me=new Message("bid winner", ((Employe)metierClient.getUtilisateur(34)), ld.get(0).getOffre().getExpediteur(),"the bid"+ld.get(0)+"is the winner accept the bid ",new Date()); 
						
						metierMessage.addMessage(mt);
						metierMessage.addMessage(me);
						
						
					  }
					
					  }
					  
				  }
				
		    /////////////
				  
				
			}
			
			
		}
	
}
